<?php

namespace common\base;

use Yii;
use yii\base\InvalidParamException;
use common\helpers\ArrayHelper;
use common\models\base\BaseOptions;

/**
 * FormModel is the base class for data form models.
 * 
 * @author emhome <emhome@163.com>
 * @since 1.0
 */
abstract class FormModel extends Model {

    /**
     * @var integer 主键ID值
     */
    public $id = 0;

    /**
     * @var string 数据原型模型
     */
    protected $modelClass;

    /**
     * @var ActiveRecordInterface 启动模型
     */
    private $_model = null;

    /**
     * 初始化基类
     * @param integer $id
     * @param array $config
     * @inheritdoc
     */
    public function __construct($id = 0, $config = []) {
        $this->setModel($id);
        parent::__construct($config);
    }

    /**
     * 获取基础模型
     * @return {$this->modelClass}::className()
     */
    public function getModel() {
        return $this->_model;
    }

    /**
     * 初始化基础模型
     */
    public function setModel($id) {
        $modelClass = $this->modelClass;
        if ($id) {
            $model = $modelClass::findOrFail($id);
            $this->setAttributes($model->attributes, false);
        } else {
            $model = new $modelClass();
        }
        if ($model == null) {
            throw new InvalidParamException('Undefind Model');
        }
        $this->setExtraAttributes($model);
        return $this->_model = $model;
    }

    /**
     * 关联模型属性设置
     * @param Object $model 模型对象
     */
    abstract public function setExtraAttributes($model);

    /**
     * 是否新增记录
     * @return boolean
     */
    public function getIsNewRecord() {
        if ($this->id) {
            return false;
        }
        return true;
    }

    /**
     * 获取预设缓存的option选项值列表
     * @return array
     */
    public static function getOptionList($attribute, $fill = null) {
        $data = ArrayHelper::getValue(BaseOptions::getOptionList(), $attribute, []);
        if ($fill !== null && !empty($data)) {
            foreach ($data as $key => $vls) {
                $data[$key] = $vls . $fill;
            }
        }
        return $data;
    }

    /**
     * 分离增删交叉数据集
     * @param array $old 原始数据
     * @param array $now 当前数据
     * @return array
     */
    public function divideViaData($old, $now) {
        $intersect = array_intersect($old, $now);
        $remove = array_diff($old, $intersect);
        $create = array_diff($now, $intersect);
        return compact('remove', 'create');
    }

    /**
     * {@inheritdoc}
     */
    public function getFormFields() {
        return $this->attributes;
    }

}
